package com.zxj.common.core.domain.vo;

import cn.hutool.core.collection.CollUtil;
import com.github.pagehelper.PageInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "分页数据结果")
public class PageVO<T> {
    @Schema(description = "总记录数")
    protected Long total;  // 总记录数
    @Schema(description = "总页数")
    protected Long pages; // 总页数
    @Schema(description = "列表数据")
    protected List<T> list; // 列表数据

    /**
     * 空数据
     * @param total 总记录数
     * @param pages 总页数
     * @return PageVO
     * @param <T> 列表元素数据类型
     */
    public static <T> PageVO<T> empty(Long total, Long pages) {
        return new PageVO<>(total, pages, CollUtil.empty(List.class));
    }

    /**
     * 空数据
     * @return PageVO
     * @param <T> 列表元素数据类型
     */
    public static <T> PageVO<T> empty() {
        return new PageVO<>(0L,0L, CollUtil.empty(List.class));
    }

    /**
     * 封装分页数据
     * @param list 列表数据
     * @return PageVO
     * @param <T> 列表元素数据类型
     */
    public  static <T> PageVO<T> of(List<T> list) {
        long total = new PageInfo<>(list).getTotal();
        Long pages = list.isEmpty() ? 0 : total / list.size() + (total % list.size() == 0 ? 0 : 1);
        return new PageVO<>(total, pages, list);
    }

    public static <T> PageVO<T> of(List<T> list, Long total) {
        Long pages = list.isEmpty() ? 0 : total / list.size() + (total % list.size() == 0 ? 0 : 1);
        return new PageVO<>(total, pages, list);
    }
}
